'''
面向对象-私有成员
私有成员：
    1. 私有成员：
        1. 私有成员：在成员名前面加两个下划线
        2. 私有成员只能在类的内部访问，不能在类的外部访问
        3. 私有成员不能被子类继承
        4. 私有成员不能被子类访问
    2. 私有方法：
        1. 私有方法：在方法名前面加两个下划线
        2. 私有方法只能在类的内部访问，不能在类的外部访问
        3. 私有方法不能被子类继承
        4. 私有方法不能被子类访问
    3.私有的意义
        1. 保护成员不被外部访问
        2. 保护方法不被外部调用
        3.隐藏了内部实现的细节，等价于Java和C++的封装[面向对象的一大特点]
        
'''
class Person:
    def __init__(self, name, age):
        self.name = name  # 公有成员
        self.__age = age  # 私有成员
    def get_age(self):  # 在类的内部可以通过self__age访问私有成员
        return self.__age
    def __haha(self):  # 私有方法
        print('haha')
 #========================================
p1 = Person('张三', 18)
print(p1.name)  # 张三
 #这里直接访问私有成员会报错
 #在类的内部可以访问私有成员外部不能访问
 #print(p1.__age)  # AttributeError: 'Person' object has no attribute '__age'
 
print(p1.get_age())  # 18
#p1.__haha()  # haha
 #在类的内部可以访问私有方法外部不能访问



'''
在python中，没有真正的私有成员和私有方法
在python解释器中，会将私有成员和私有方法的名字进行改名
改名的规则：_类名__成员名
比如：_Person__age
     _Person__haha
访问时只要将改名后的名字写出来即可，但是不建议这样访问
因为这样的访问会破坏规则，方式是不规范的，而且会影响到代码的可读性

'''
print(p1.__dir__())  # {'name': '张三', '_Person__age': 18}
print(p1._Person__age)  # 18
print(p1._Person__haha())  # haha
#学生模块，包含学生的增删改查功能，我们可以将这个模块导入到其他的模块中，从而实现学生的功能

def add_student():
    print('add_student')
def del_student():
    print('del_student')
def update_student():
    print('update_student')
def query_student():
    print('query_student')